package org.kangjia;

import org.apache.poi.ss.usermodel.*;
import org.kangjia.exportFile.ExportExcel;
import org.kangjia.extend.Customize;
import org.kangjia.hook.DynamicFieldsExcelExportHandler;
import org.kangjia.hook.ExcelImportHandler;
import org.kangjia.importFile.ImportExcel;
import org.kangjia.importFile.ImportResult;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;

public class ExcelUtils{

    /**
     * 根据行和列的索引获取单元格的值
     * @param sheet           sheet对象
     * @param rowNum          行索引
     * @param columnNum       列索引
     * @param cellTypeEnum    单元格数据类型
     * @return
     */
    public static Object getExcelDateByIndex(Sheet sheet, int rowNum, int columnNum, CellType cellTypeEnum){
        Object result = "";
        Row row = sheet.getRow(rowNum);
        Cell cell = row.getCell(columnNum);
        if(CellType.NUMERIC == cellTypeEnum){
            result = cell.getNumericCellValue();
        }else if(CellType.STRING == cellTypeEnum){
            result = cell.getStringCellValue();
        }else if(CellType.FORMULA == cellTypeEnum){
            result = cell.getCellFormula();
        }else if(CellType.BLANK == cellTypeEnum){
            result = "";
        }else if(CellType.BOOLEAN == cellTypeEnum){
            result = cell.getBooleanCellValue();
        }else{
            result = null;
        }
        return result;
    }

    /**
     * 根据某一列值为“******”的这一行，来获取该行第x列的值
     * @param sheet           sheet对象
     * @param cellValue       当前单元格的值
     * @param currentColumn   当前单元格列的索引
     * @param targetColumn    目标单元格列的索引
     * @return
     */
    public static String getCellByCaseName(Sheet sheet,String cellValue,int currentColumn,int targetColumn){
        String operateSteps="";
        //获取行数
        int rows = sheet.getPhysicalNumberOfRows();
        for(int i=0;i<rows;i++){
            Row row = sheet.getRow(i);
            String cell = row.getCell(currentColumn).toString();
            if(cell.equals(cellValue)){
                operateSteps = row.getCell(targetColumn).toString();
                break;
            }
        }
        return operateSteps;
    }

    /**
     * 导出excel
     * @param clazz                 要导出的实体类的类对象
     * @param list                  要导出的数据
     * @param sheetName             sheetName
     * @return
     */
    public static <T> Workbook exportExcel(Class<T> clazz, List<T> list, String sheetName){
        return new ExportExcel<T>(clazz,list,sheetName,null,null,null).execute();
    }

    /**
     * 导出excel
     * @param clazz                             要导出的实体类的类对象
     * @param list                              要导出的数据
     * @param sheetName                         sheetName
     * @param dynamicFieldsExcelExportHandler   动态导出指定字段策略
     * @return
     */
    public static <T> Workbook exportExcel(Class<T> clazz, List<T> list, String sheetName,DynamicFieldsExcelExportHandler dynamicFieldsExcelExportHandler){
        return new ExportExcel<T>(clazz,list,sheetName,null,null,dynamicFieldsExcelExportHandler).execute();
    }

    /**
     * 导出excel
     * @param clazz                 要导出的实体类的类对象
     * @param list                  要导出的数据
     * @param sheetName             sheetName
     * @param fileName              文件名称
     * @return
     */
    public static <T> Workbook exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName){
        return new ExportExcel<T>(clazz,list,sheetName,fileName,null,null).execute();
    }

    /**
     * 导出excel
     * @param clazz                             要导出的实体类的类对象
     * @param list                              要导出的数据
     * @param sheetName                         sheetName
     * @param fileName                          文件名称
     * @param dynamicFieldsExcelExportHandler   动态导出指定字段策略
     * @return
     */
    public static <T> Workbook exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName,DynamicFieldsExcelExportHandler dynamicFieldsExcelExportHandler){
        return new ExportExcel<T>(clazz,list,sheetName,fileName,null,dynamicFieldsExcelExportHandler).execute();
    }

    /**
     * 导出excel
     * @param clazz                 要导出的实体类的类对象
     * @param list                  要导出的数据
     * @param sheetName             sheetName
     * @param customize             自定义样式
     * @return
     */
    public static <T> Workbook exportExcel(Class<T> clazz, List<T> list, String sheetName, Customize customize){
        return new ExportExcel<T>(clazz,list,sheetName,null,customize,null).execute();
    }

    /**
     * 导出excel
     * @param clazz                             要导出的实体类的类对象
     * @param list                              要导出的数据
     * @param sheetName                         sheetName
     * @param customize                         自定义样式
     * @param dynamicFieldsExcelExportHandler   动态导出指定字段策略
     * @return
     */
    public static <T> Workbook exportExcel(Class<T> clazz, List<T> list, String sheetName, Customize customize,DynamicFieldsExcelExportHandler dynamicFieldsExcelExportHandler){
        return new ExportExcel<T>(clazz,list,sheetName,null,customize,dynamicFieldsExcelExportHandler).execute();
    }

    /**
     * 导出excel
     * @param clazz                 要导出的实体类的类对象
     * @param list                  要导出的数据
     * @param sheetName             sheetName
     * @param fileName              文件名称
     * @param customize             自定义样式
     * @return
     */
    public static <T> Workbook exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName, Customize customize){
        return new ExportExcel<T>(clazz,list,sheetName,fileName,customize,null).execute();
    }

    /**
     * 导出excel
     * @param clazz                             要导出的实体类的类对象
     * @param list                              要导出的数据
     * @param sheetName                         sheetName
     * @param fileName                          文件名称
     * @param customize                         自定义样式
     * @param dynamicFieldsExcelExportHandler   动态导出指定字段策略
     * @return
     */
    public static <T> Workbook exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName, Customize customize,DynamicFieldsExcelExportHandler dynamicFieldsExcelExportHandler){
        return new ExportExcel<T>(clazz,list,sheetName,fileName,customize,dynamicFieldsExcelExportHandler).execute();
    }

    /**
     * 导出excel
     * @param clazz                 要导出的实体类的类对象
     * @param list                  要导出的数据
     * @param sheetName             sheetName
     * @param response              响应
     * @return
     */
    public static <T> void exportExcel(Class<T> clazz, List<T> list, String sheetName, HttpServletResponse response){
        exportExcel(clazz,list,sheetName,null,response);
    }

    /**
     * 导出excel
     * @param clazz                             要导出的实体类的类对象
     * @param list                              要导出的数据
     * @param sheetName                         sheetName
     * @param response                          响应
     * @param dynamicFieldsExcelExportHandler   动态导出指定字段策略
     * @return
     */
    public static <T> void exportExcel(Class<T> clazz, List<T> list, String sheetName, HttpServletResponse response,DynamicFieldsExcelExportHandler dynamicFieldsExcelExportHandler){
        exportExcel(clazz,list,sheetName,null,response,null,dynamicFieldsExcelExportHandler);
    }

    /**
     * 导出excel
     * @param clazz                 要导出的实体类的类对象
     * @param list                  要导出的数据
     * @param sheetName             sheetName
     * @param fileName              文件名称
     * @param outPath               导出地址
     * @return
     */
    public static <T> void exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName, String outPath){
        exportExcel(clazz,list,sheetName,fileName,outPath,null,null);
    }

    /**
     * 导出excel
     * @param clazz                 要导出的实体类的类对象
     * @param list                  要导出的数据
     * @param sheetName             sheetName
     * @param fileName              文件名称
     * @param response              响应
     * @return
     */
    public static <T> void exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName, HttpServletResponse response){
        exportExcel(clazz,list,sheetName,fileName,response,null,null);
    }

    /**
     * 导出excel
     * @param clazz                             要导出的实体类的类对象
     * @param list                              要导出的数据
     * @param sheetName                         sheetName
     * @param fileName                          文件名称
     * @param response                          响应
     * @param dynamicFieldsExcelExportHandler   动态导出指定字段策略
     * @return
     */
    public static <T> void exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName, HttpServletResponse response,DynamicFieldsExcelExportHandler dynamicFieldsExcelExportHandler){
        exportExcel(clazz,list,sheetName,fileName,response,null,dynamicFieldsExcelExportHandler);
    }

    /**
     * 导出excel
     * @param clazz                             要导出的实体类的类对象
     * @param list                              要导出的数据
     * @param sheetName                         sheetName
     * @param fileName                          文件名称
     * @param outPath                           导出地址
     * @param dynamicFieldsExcelExportHandler   动态导出指定字段策略
     * @return
     */
    public static <T> void exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName, String outPath, DynamicFieldsExcelExportHandler dynamicFieldsExcelExportHandler){
        exportExcel(clazz,list,sheetName,fileName,outPath,null,dynamicFieldsExcelExportHandler);
    }

    /**
     * 导出excel
     * @param clazz                 要导出的实体类的类对象
     * @param list                  要导出的数据
     * @param sheetName             sheetName
     * @param fileName              文件名称
     * @param response              响应
     * @param customize             自定义样式
     * @return
     */
    public static <T> void exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName, HttpServletResponse response, Customize customize){
        exportExcel(clazz,list,sheetName,fileName,response,customize,null);
    }

    /**
     * 导出excel
     * @param clazz                 要导出的实体类的类对象
     * @param list                  要导出的数据
     * @param sheetName             sheetName
     * @param fileName              文件名称
     * @param outPath               导出地址
     * @param customize             自定义样式
     * @return
     */
    public static <T> void exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName, String outPath, Customize customize){
        exportExcel(clazz,list,sheetName,fileName,outPath,customize,null);
    }

    /**
     * 导出excel
     * @param clazz                                 要导出的实体类的类对象
     * @param list                                  要导出的数据
     * @param sheetName                             sheetName
     * @param fileName                              文件名称
     * @param response                              响应
     * @param customize                             自定义样式
     * @param dynamicFieldsExcelExportHandler       动态导出指定字段策略
     * @return
     */
    public static <T> void exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName, HttpServletResponse response, Customize customize, DynamicFieldsExcelExportHandler dynamicFieldsExcelExportHandler){
        new ExportExcel<T>(clazz,list,sheetName,fileName,customize,dynamicFieldsExcelExportHandler).execute(response);
    }

    /**
     * 导出excel
     * @param clazz                                 要导出的实体类的类对象
     * @param list                                  要导出的数据
     * @param sheetName                             sheetName
     * @param fileName                              文件名称
     * @param outPath                               导出地址
     * @param customize                             自定义样式
     * @param dynamicFieldsExcelExportHandler       动态导出指定字段策略
     * @return
     */
    public static <T> void exportExcel(Class<T> clazz, List<T> list, String sheetName, String fileName, String outPath, Customize customize, DynamicFieldsExcelExportHandler dynamicFieldsExcelExportHandler){
        new ExportExcel<T>(clazz,list,sheetName,fileName,customize,dynamicFieldsExcelExportHandler).execute(outPath);
    }

    /**
     * 导入excel数据到项目
     * @param is           excel文件输入流
     * @param clazz        数据承载的类对象
     * @param handler      数据导入的钩子
     * @return
     */
    public static <T> ImportResult importExcel(InputStream is, Class<T> clazz, ExcelImportHandler handler) throws Exception {
        return importExcel(is, clazz, null, null,null,null, handler);
    }

    /**
     * 导入excel数据到项目
     * @param is           excel文件输入流
     * @param clazz        数据承载的类对象
     * @param titleRowNum  文件中标题的行数
     * @param handler      数据导入的钩子
     * @return
     */
    public static <T> ImportResult importExcel(InputStream is, Class<T> clazz, Integer titleRowNum, ExcelImportHandler handler) throws Exception {
        return importExcel(is, clazz,titleRowNum, null, null, handler);
    }

    /**
     * 导入excel数据到项目
     * @param is           excel文件输入流
     * @param clazz        数据承载的类对象
     * @param sheetName    sheetName
     * @param handler      数据导入的钩子
     * @return
     */
    public static <T> ImportResult importExcel(InputStream is, Class<T> clazz, String sheetName, ExcelImportHandler handler) throws Exception {
        return importExcel(is, clazz,sheetName, null, null, handler);
    }

    /**
     * 导入excel数据到项目
     * @param is           excel文件输入流
     * @param clazz        数据承载的类对象
     * @param titleRowNum  文件中标题的行数
     * @param cacheSize    集合缓存大小
     * @param handler      数据导入的钩子
     * @return
     */
    public static <T> ImportResult importExcel(InputStream is, Class<T> clazz, Integer titleRowNum, Integer cacheSize, ExcelImportHandler handler) throws Exception {
        return importExcel(is, clazz, titleRowNum, cacheSize, null, handler);
    }

    /**
     * 导入excel数据到项目
     * @param is           excel文件输入流
     * @param clazz        数据承载的类对象
     * @param sheetName    sheetName
     * @param titleRowNum  文件中标题的行数
     * @param handler      数据导入的钩子
     * @return
     */
    public static <T> ImportResult importExcel(InputStream is, Class<T> clazz, String sheetName, Integer titleRowNum, ExcelImportHandler handler) throws Exception {
        return importExcel(is, clazz,sheetName, titleRowNum, null, handler);
    }

    /**
     * 导入excel数据到项目
     * @param is           excel文件输入流
     * @param clazz        数据承载的类对象
     * @param sheetName    sheetName
     * @param titleRowNum  文件中标题的行数
     * @param cacheSize    集合缓存大小
     * @param handler      数据导入的钩子
     * @return
     */
    public static <T> ImportResult importExcel(InputStream is, Class<T> clazz, String sheetName, Integer titleRowNum, Integer cacheSize, ExcelImportHandler handler) throws Exception {
        return importExcel(is, clazz,sheetName, titleRowNum, cacheSize, null, handler);
    }

    /**
     * 导入excel数据到项目
     * @param is           excel文件输入流
     * @param clazz        数据承载的类对象
     * @param titleRowNum  文件中标题的行数
     * @param cacheSize    集合缓存大小
     * @param saveFailThreshold   连续保存数据失败次数阈值
     * @param handler      数据导入的钩子
     * @return
     */
    public static <T> ImportResult importExcel(InputStream is, Class<T> clazz, Integer titleRowNum, Integer cacheSize, Integer saveFailThreshold, ExcelImportHandler handler) throws Exception {
        return importExcel(is, clazz, null, titleRowNum, cacheSize, saveFailThreshold, handler);
    }

    /**
     * 导入excel数据到项目
     * @param is           excel文件输入流
     * @param clazz        数据承载的类对象
     * @param sheetName    sheetName
     * @param titleRowNum  文件内容中标题行数
     * @param cacheSize    集合缓存大小
     * @param saveFailThreshold   连续保存数据失败次数阈值
     * @param handler      数据导入的钩子
     * @return
     */
    public static <T> ImportResult importExcel(InputStream is, Class<T> clazz, String sheetName, Integer titleRowNum, Integer cacheSize, Integer saveFailThreshold, ExcelImportHandler handler) throws Exception {
        return new ImportExcel<T>(is, clazz, sheetName, titleRowNum, cacheSize, saveFailThreshold, handler).execute();
    }
}
